package thread;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wx
 * Date: 2023-12-07
 * Time: 0:01
 */
//中断一个线程 (叫终止一个线程更贴切一点)
// 中断这个词本身也有多种含义.(所以我们尽可能的叫终止一个线程,防止混乱)
public class ThreadDemo11 {

    //如果吧isquit 换成 main 方法中的 局部变量,是否可行!!!
    //为什么不可行?



    //如果main线程,想让 t 线程结束,前提得是,一定是 t 线程的代码,对逻辑有所支持
    //而不是 t 里的代码随便编写都可以结束
    public static void main4(String[] args) {
        boolean isQuit = false;
        Thread t  = new Thread(() -> {
             /* while(!isQuit) {  //在 lambda 表达式中有一个语法叫做 变量捕获
                                  // lambda 表达式/匿名内部类可以访问到外边定义的局部变量(变量捕获的语法规则).
                                                                               //但是捕获到的变量,得是finnal 或 事实finnal
                                                                               //虽然没写finnal,但是没有修改

                System.out.println("这是一个线程,工作中");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            } */
            System.out.println("线程工作完毕");
        });
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("让线程 t 结束");
        isQuit = true;
        //如果代码没有配合,main 无法让 t 线程提前结束;
    }




    //解决方法就是加一个标志位
    //关键在于使用isQuit变量 退出循环,这样就能结束线程
    private static boolean isQuit = false;

    //为什么写成成员变量可行?
    // lambda 表达式,本质上是"函数式接口" => 匿名内部类
    // 内部类,访问外部类的成员变量,这个事情,本身就是可以的


    //如果main线程,想让 t 线程结束,前提得是,一定是 t 线程的代码,对逻辑有所支持
    //而不是 t 里的代码随便编写都可以结束
    public static void main3(String[] args) {
        //boolean isQuit = false;
        Thread t  = new Thread(() -> {
            while(!isQuit) { //将 true 改为变量去进行表示
                System.out.println("这是一个线程,工作中");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("线程工作完毕");
        });
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("让线程 t 结束");
        isQuit = true;
        //如果代码没有配合,main 无法让 t 线程提前结束;
    }

    public static void main2(String[] args) {
        Thread t  = new Thread(() -> {
            while(true) {
                System.out.println("这是一个线程,工作中");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            //当前是死循环,所以会给出错误
            //System.out.println("线程工作完毕");
        });
        t.start();
    }

    //死循环无法被终止
    public static void main1(String[] args) {
        Thread t  = new Thread(() -> {
            while(true) {
                System.out.println("这是一个线程,工作中");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t.start();
    }

}
